﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using System.Xml.Linq;

namespace IBoLT.SettingWindows
{
	/// <summary>
	/// Логика взаимодействия для Leaves.xaml
	/// </summary>
	public partial class Leaves : Window
	{
		// Тектура для предпросмотра
		private System.Drawing.Bitmap texture;

		// Экземпляр класса для построения фрактала Мандельброта (доступ к полям public)
		public Fractals.Leaves fractal = new Fractals.Leaves();
		public TextureSettings STexture;

		private CommandBinding commBind;

		public Leaves(System.Drawing.Bitmap sourcePreview, TextureSettings STexture)
		{
			this.STexture = STexture;

			InitializeComponent();

			// Добавляю обработчик к событиям в коде, т.к. для его работы необходимо создание формы
			sliderElongWidth.ValueChanged += hLeavesSliderPreview;
			sliderElongHeight.ValueChanged += hLeavesSliderPreview;

			// Привязка команд к обработчикам //
			commBind = new CommandBinding(CommandsIBoLT.cLeavesPreview, hLeavesPreviewEx); this.CommandBindings.Add(commBind);
			commBind = new CommandBinding(CommandsIBoLT.cLeavesGenerate, hLeavesGenerateEx); this.CommandBindings.Add(commBind);
			commBind = new CommandBinding(CommandsIBoLT.cLeavesChColor, hLeavesChColorEx);

			texture = sourcePreview;
			wPreview.Width = sourcePreview.Width;
			wPreview.Height = sourcePreview.Height;

			fractal.Texture = (System.Drawing.Bitmap)texture.Clone();
			sliderElongWidth.Maximum = fractal.MaxCMWidth;
			sliderElongHeight.Maximum = fractal.MaxCMHeight;

			// Вывожу палитру на форму
			ApplyPaletteToForm();

			CommandsIBoLT.cLeavesPreview.Execute(null, this);
		}

		// Обработчик изменения значения ползунков
		private void hLeavesSliderPreview(object sender, RoutedPropertyChangedEventArgs<double> e)
		{
			CommandsIBoLT.cLeavesPreview.Execute(null, this);
		}

		// Отображаю на форме настройку палитры для раскраски фрактала
		private void ApplyPaletteToForm()
		{
			// Размер кнопок для вывода цветов
			int buttonSize = 25;

			wPalette.Width = buttonSize;
			wPalette.Height = buttonSize * fractal.palette.Length;

			for (int i = 0; i < fractal.palette.Length; ++i)
			{
				Button b = new Button();
				b.Width = buttonSize;
				b.Height = buttonSize;
				System.Drawing.Color clr = System.Drawing.Color.FromArgb(fractal.palette[i]);
				b.Background = new SolidColorBrush(Color.FromRgb(clr.R, clr.G, clr.B));
				b.TabIndex = i;
				wPalette.Children.Add(b);

				b.CommandBindings.Add(commBind);
				b.Command = CommandsIBoLT.cLeavesChColor;
			}
		}

		private void GetDataFromForm()
		{
			fractal.CMWidth = sliderElongWidth.Value;
			fractal.CMHeight = sliderElongHeight.Value;
		}

		// Обработчик кнопок выбора цвета
		private void hLeavesChColorEx(object sender, ExecutedRoutedEventArgs e)
		{
			System.Windows.Forms.ColorDialog colorDialog = new System.Windows.Forms.ColorDialog();
			Button btn = (Button)sender;

			if (colorDialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
			{
				System.Drawing.Color SDColor = colorDialog.Color;
				Color SWMColor = new Color();

				SWMColor.A = SDColor.A;
				SWMColor.R = SDColor.R;
				SWMColor.G = SDColor.G;
				SWMColor.B = SDColor.B;

				Brush brush = new SolidColorBrush(SWMColor);
				btn.Background = brush;
				fractal.palette[btn.TabIndex] = colorDialog.Color.ToArgb();

				CommandsIBoLT.cLeavesPreview.Execute(null, this);
			}
		}

		// Обработчик кнопки "Просмотр"
		private void hLeavesPreviewEx(object sender, ExecutedRoutedEventArgs e)
		{
			GetDataFromForm();
			fractal.Texture = (System.Drawing.Bitmap)texture.Clone();
			wPreview.Source = SystemDrawingHelper.BitmapToBitmapImage(fractal.Calculate());
		}

		// Обработчик кнопки "Генерировать"
		private void hLeavesGenerateEx(object sender, ExecutedRoutedEventArgs e)
		{
			GetDataFromForm();

			STexture.Settings.Root.Add(new XElement("Генератор",
			    new XAttribute("Название", "FractalLeavesFern"),
			    new XElement("Параметры",
			        new XElement("Вытянутость",
			            new XAttribute("По_ширине", fractal.CMWidth),
			            new XAttribute("По_высоте", fractal.CMHeight)))));

			// Диалог успешен
			DialogResult = true;
		}

	}
}
